package com.scalar.chiptrack.operations.dataentry.inventoryTransit.actioncommands;

import org.apache.struts.action.ActionForward;
import org.apache.struts.action.ActionMapping;
import org.apache.struts.action.ActionForm;
import org.apache.struts.util.LabelValueBean;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;

import com.scalar.chiptrack.operations.process.dao.ProductDao;
import com.scalar.chiptrack.operations.dataentry.dao.DataEntryDAO;
import com.scalar.chiptrack.operations.dataentry.LotDetails;
import com.scalar.chiptrack.operations.dataentry.inventoryTransit.forms.InventoryTransitForm;
import com.scalar.chiptrack.operations.vendor.dao.VendorDAO;
import com.scalar.chiptrack.operations.release.dao.RelaseDAO;

import com.scalar.chiptrack.users.User;
import com.scalar.chiptrack.users.Functionality;
import com.scalar.chiptrack.actioncommands.ActionCommand;
import com.scalar.chiptrack.commons.SessionKeys;
import com.scalar.chiptrack.utils.WorkWeek;

import java.util.HashMap;
import java.util.ArrayList;
import java.util.Date;
import java.util.Calendar;

/**
 * Created by IntelliJ IDEA.
 * User: ChandraSekhar
 * Date: Fed 06, 2008
 * Time: 12:28:08 PM
 */
public class InventoryTransitLoadPartNumbersCommand extends ActionCommand
{
    private static final String ACTION_NAME = "/inventoryTransit.do" ;

    public ActionForward execute(ActionMapping mapping,
                                 ActionForm form,
                                 HttpServletRequest request,
                                 HttpServletResponse response) throws Exception
    {

        InventoryTransitForm inventoryTransitForm = (InventoryTransitForm) form;

        HashMap errors = new HashMap();
        HashMap info = new HashMap();
        String action = request.getParameter("action");
        String locationType = null;
        request.setAttribute(INFO_MESSAGES, info);
        request.setAttribute(ERROR_MESSAGES, errors);

        HttpSession mSession = request.getSession();
        User user = (User) mSession.getAttribute(SessionKeys.USER_KEY);

        if (user == null)
        {
            mSession.setAttribute(SessionKeys.SOURCE_PAGE_KEY, ACTION_NAME);
            return (mapping.findForward("login"));
        }
        else
        {
            if (user.isActionAllowed(Functionality.DATA_ENTRY, User.USER_ACTION_MODIFY))
            {
                request.setAttribute("showMessage", "FALSE");
            }
            else
            {
                request.setAttribute("showMessage", "TRUE");
            }
        }
        ArrayList allRunningWipLotList;
        ArrayList dateCodeList = new ArrayList();
        ArrayList vendorList = new ArrayList();
        //Calendar cal = new GregorianCalendar();
        LotDetails lotDetails = new LotDetails();

       try
       {
            int currentwk1; int currentwk2; int currentwk3;
            String yearAsDigit1; String yearAsDigit2; String yearAsDigit3;
            WorkWeek wk = WorkWeek.getCurrentWorkWeekInstance();
            currentwk1 = wk.getCurrentWWNumber();
            yearAsDigit1  = (wk.getWorkWeekYear()+"").substring(2);
          if ( currentwk1 == 1 )
          {
              Date dt =  wk.getCurrentWWStartDate();
              Calendar previousWkDate = Calendar.getInstance();
              previousWkDate.setTime( dt );
              previousWkDate.add( Calendar.DATE, -3 );
              WorkWeek prevWk = WorkWeek.getWorkWeekInstance( previousWkDate.getTime() );
              currentwk2 = prevWk.getCurrentWWNumber();
              currentwk3 = currentwk2 -1;
              yearAsDigit2  = (prevWk.getWorkWeekYear()+"").substring(2);
              yearAsDigit3 = yearAsDigit2;
          }
          else if ( currentwk1 == 2 )
          {
              currentwk2 = currentwk1 -1;
              yearAsDigit2  = yearAsDigit1;

              Date dt =  wk.getCurrentWWStartDate();
              Calendar previousWkDate = Calendar.getInstance();
              previousWkDate.setTime( dt );
              previousWkDate.add( Calendar.DATE, -10 );
              WorkWeek prevWk = WorkWeek.getWorkWeekInstance( previousWkDate.getTime() );
              currentwk3 = prevWk.getCurrentWWNumber();
              yearAsDigit3  = (prevWk.getWorkWeekYear()+"").substring(2);

          }
          else
          {
              currentwk2 = currentwk1 -1;
              currentwk3 = currentwk1 -2;
              yearAsDigit2  = yearAsDigit1;
              yearAsDigit3 = yearAsDigit1;
          }

          dateCodeList.add( new LabelValueBean(yearAsDigit3 + (currentwk3<10?"0"+currentwk3 : ""+currentwk3), yearAsDigit3 + (currentwk3<10?"0"+currentwk3 : ""+currentwk3) ) );
          dateCodeList.add( new LabelValueBean(yearAsDigit2 + (currentwk2<10?"0"+currentwk2 : ""+currentwk2), yearAsDigit2 + (currentwk2<10?"0"+currentwk2 : ""+currentwk2) ) );
          dateCodeList.add( new LabelValueBean(yearAsDigit1 + (currentwk1<10?"0"+currentwk1 : ""+currentwk1), yearAsDigit1 + (currentwk1<10?"0"+currentwk1 : ""+currentwk1) ) );


            dateCodeList.add( new LabelValueBean("--other--", "0") );
           
            if ( LOCATION_TYPE_ASSEMBLY.equalsIgnoreCase(inventoryTransitForm.getProcessType()) )
            {
                locationType = LOCATION_TYPE_ASSEMBLY;
            }
            else if ( LOCATION_TYPE_FT.equalsIgnoreCase(inventoryTransitForm.getProcessType()) )
            {
                locationType = LOCATION_TYPE_TEST;
            }
            else if ( LOCATION_TYPE_FPO.equalsIgnoreCase(inventoryTransitForm.getProcessType()) )
            {
                locationType = LOCATION_TYPE_TEST;
            }
            else if ( LOCATION_TYPE_TAPE_AND_REEL.equalsIgnoreCase(inventoryTransitForm.getProcessType()) )
            {
                locationType = LOCATION_TYPE_CLASS_STORE;
            }
            else if ( LOCATION_TYPE_FG.equalsIgnoreCase(inventoryTransitForm.getProcessType()) )
            {
                locationType = LOCATION_TYPE_FINISHED_GOODS;
            }

            if ( user.getVendorId() > 0 ) // for VENDOR INTERFACE
            {
                inventoryTransitForm.setLocationId(0);
                if (inventoryTransitForm.getLocationId() == 0 )
                {
                    vendorList =  VendorDAO.getInventoryLocationsByProcessByUserType( null, locationType , user.getVendorId() );
                    if ( vendorList != null && vendorList.size() > 0  )
                    {
                        inventoryTransitForm.setLocationId( Integer.parseInt ( ( (LabelValueBean)vendorList.get(0) ).getValue() ) );
                    }
                }
            }

            request.setAttribute("processTypeList", lotDetails.getInventoryTransitProcessList() );
           
            if ( LOCATION_TYPE_FG.equalsIgnoreCase( inventoryTransitForm.getProcessType() ) )
            {
                if (  "search".equalsIgnoreCase(action) )
                {
                    allRunningWipLotList = DataEntryDAO.getAllRunningLots( inventoryTransitForm.getProcessType() , inventoryTransitForm.getProcessStepId() , inventoryTransitForm.getLocationId(), inventoryTransitForm.getLotId(), false  );

                    if ( allRunningWipLotList == null || allRunningWipLotList.size() == 0 )
                    {
                       info.put("No WIP lots available" , null );
                    }
                    inventoryTransitForm.setWipLotsList( allRunningWipLotList );
                    request.setAttribute("lotsList", allRunningWipLotList );
                }
                else
                {
                    request.setAttribute("lotsList", new ArrayList() );
                    inventoryTransitForm.setWipLotsList( new ArrayList() );
                }
                //request.setAttribute("partNumbersList", ProductDao.loadAllPartsForProcessTypeNotInOtherByPsType( inventoryTransitForm.getProcessType(), LOCATION_TYPE_TAPE_AND_REEL ) );
                request.setAttribute("nextLocations",  RelaseDAO.loadProcessVendors( LOCATION_TYPE_CLASS_STORE ) );
                request.setAttribute("reciveProcessList", lotDetails.getFgPreviousProcessList() );
            }
            else
            {
               allRunningWipLotList = DataEntryDAO.getAllRunningLots( inventoryTransitForm.getProcessType() , inventoryTransitForm.getProcessStepId() , inventoryTransitForm.getLocationId(), inventoryTransitForm.getLotId(), false  );

               if ( allRunningWipLotList == null || allRunningWipLotList.size() == 0 )
               {
                   info.put("No WIP lots available" , null );
               }
               inventoryTransitForm.setWipLotsList( allRunningWipLotList );
               request.setAttribute("lotsList", allRunningWipLotList );

               request.setAttribute("nextLocations",  RelaseDAO.loadProcessVendors( locationType ) );
               //request.setAttribute("partNumbersList", ProductDao.loadAllPartsForProcessTypeByPsType( inventoryTransitForm.getProcessType() ) );
               request.setAttribute("reciveProcessList", lotDetails.getInventoryReceiveProcessList() );
            }
            request.setAttribute("partNumbersList", ProductDao.loadAllPartsForProcessTypeByPsType( inventoryTransitForm.getProcessType() ) );
            request.setAttribute("locationList", VendorDAO.getInventoryLocationsByProcessByUserType( null, locationType, user.getVendorId() ) );

            request.setAttribute("dateCodeList", dateCodeList );
            request.setAttribute("action", action);
        }
        catch( Exception e)
        {
           request.setAttribute("processTypeList", lotDetails.getInventoryTransitProcessList() );
           errors.put( "Unable to get Inventory Lots", null);
           e.printStackTrace();
        }
        return mapping.findForward( "inventoryTransit" );
    }
}
